﻿using System.Diagnostics;
using Core.Attributes;
using Core.Pipeline.Attributes;
using MediatR;
using Microsoft.Extensions.Logging;
using Serilog.Context;

namespace Infrastructure.Pipeline;

//[PipelineOrder(-100)] //  为最高优先级（最先注册）
//public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : notnull
//{
//    private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;

//    public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger)
//        => _logger = logger;

//    public async Task<TResponse> Handle(
//        TRequest request,
//        RequestHandlerDelegate<TResponse> next,
//        CancellationToken cancellationToken)
//    {
//        return await next(); // 不记录日志，直接执行
//        //var requestType = typeof(TRequest);
//        //var noLogging = requestType.GetCustomAttributes(typeof(NoLoggingAttribute), inherit: true).Any();
//        //if (noLogging)
//        //{
//        //    return await next(); // 不记录日志，直接执行
//        //}
//        //var traceId = Activity.Current?.TraceId.ToString() ?? string.Empty;
//        //var stopwatch = Stopwatch.StartNew();
//        //try
//        //{
//        //    // 1. 调用下一个管道或核心处理器
//        //    var response = await next();

//        //    // 2. 请求后日志
//        //    stopwatch.Stop();

//        //    var status = 200;
//        //    var elapsed = stopwatch.ElapsedMilliseconds;
//        //    using (LogContext.PushProperty("TraceId", traceId))
//        //    using (LogContext.PushProperty("ElapsedMilliseconds", elapsed))
//        //    using (LogContext.PushProperty("StatusCode", status))
//        //    {
//        //        _logger.LogInformation(
//        //            "请求 {RequestType}，参数：{@Request}，处理成功！耗时：{Elapsed}ms，响应：{@Response}，响应状态码：{StatusCode}",
//        //            typeof(TRequest).Name, request, elapsed, response, status);
//        //    }

//        //    return response;
//        //}
//        //catch (Exception ex)
//        //{
//        //    // 3. 异常日志
//        //    stopwatch.Stop();

//        //    var status = 200;
//        //    var elapsed = stopwatch.ElapsedMilliseconds;
//        //    using (LogContext.PushProperty("TraceId", traceId))
//        //    using (LogContext.PushProperty("ElapsedMilliseconds", elapsed))
//        //    using (LogContext.PushProperty("StatusCode", status))
//        //    {
//        //        _logger.LogError(ex,
//        //            "请求 {RequestType}，参数：{@Request}，处理失败！耗时：{Elapsed}ms，错误：{Message},响应状态码：{StatusCode}",
//        //            typeof(TRequest).Name, request, elapsed, ex.Message, status);
//        //    }
//        //    throw;
//        //}
//    }
//}
